/*
 Copyright aswing.org, see the LICENCE.txt.
注释翻译+补充 by: Roland
*/

package com.darwin.darwinImage.png{

import flash.utils.ByteArray;	

/**
 * 文件头数据块IHDR(header chunk)
 * <br/>包含有PNG文件中存储的图像数据的基本信息，并作为第一个数据块出现在PNG数据流中，一个PNG数据流中只能有一个文件头数据块。
 * <br/>
 * <br/>有关 PNG 规范，请参见一下网址:
 * <ul>
 *     <li>http://www.w3.org/TR/PNG/</li>
 *     <li>http://www.libpng.org/pub/png/spec/iso/index-object.html</li>
 * </ul>  
 * 
 * @author iiley
 */
public class IHDR implements Chunk{
	
	/**图像类型: 灰度图像 */
	public static const CT_GreyScale:int = 0;
	/**图像类型: 真彩色图像 */
	public static const CT_TrueColor:int = 2;
	/**图像类型: 索引彩色图像 */
	public static const CT_IndexedColor:int = 3;
	/**图像类型: 带α通道数据的灰度图像 */
	public static const CT_GreyScale_Alpha:int = 4;
	/**图像类型: 带α通道数据的真彩色图像 */
	public static const CT_TrueColor_Alpha:int = 6;
	
	/**图像深度值为1 */
	public static const ByteDepth_1:int = 1;
	/**图像深度值为2 */
	public static const ByteDepth_2:int = 2;
	/**图像深度值为4 */
	public static const ByteDepth_4:int = 4;
	/**图像深度值为8 */
	public static const ByteDepth_8:int = 8;
	/**图像深度值为16 */
	public static const ByteDepth_16:int = 16;
	
	/**
	 * 图像宽度，以像素为单位 
	 */
	public var width:int;
	/**
	 *	图像高度，以像素为单位 
	 */
	public var height:int;
	
	/**
	 * 图像深度(位深), 必须是一下所列项静态常量之一 : 
	 * <ul>
	 *     <li>IHDR.ByteDepth_1</li>
	 *     <li>IHDR.ByteDepth_2</li>
	 *     <li>IHDR.ByteDepth_4</li>
	 *     <li>IHDR.ByteDepth_8</li>
	 *     <li>IHDR.ByteDepth_16</li>
	 * </ul>
	 * <br/>
	 * 相关图像位深参考
	 * <ul>
	 *     <li>灰度图像:位深1,2,4,8或16</li>
	 *     <li>真彩色图像:位深8或16</li>
	 *     <li>索引彩色图像:位深1,2,4或8</li>
	 *     <li>带α通道数据的灰度图像:位深8或16</li>
	 *     <li>带α通道数据的真彩色图像:位深8或16</li>
	 * </ul>
	 */
	public var bitDepth:int;
	
	/**
	 * 颜色类型, 必须是一下所列项静态常量之一 : 
	 * <ul>
	 *     <li>IHDR.CT_GreyScale(灰度图像, 位深1,2,4,8或16 )</li>
	 *     <li>IHDR.CT_TrueColor(真彩色图像,位深8或16)</li>
	 *     <li>IHDR.CT_IndexedColor(索引彩色图像,位深1,2,4或8)</li>
	 *     <li>IHDR.CT_Greyscale_Alpha(带α通道数据的灰度图像,位深8或16 )</li>
	 *     <li>IHDR.CT_TrueColor_Alpha(带α通道数据的真彩色图像,位深8或16)</li>
	 * </ul>
	 */	
	public var colorType:int;
	
	/**压缩方法(LZ77派生算法) */
	public var compressionMethod:int = 0;
	/**滤波器方法 */
	public var filterMethod:int = 0;
	/**
	 *	隔行扫描方法 
	 * <ul>
	 * 	<li>0:非隔行扫描 </li>
	 * 	<li>1: Adam7(由Adam M. Costello开发的7遍隔行扫描方法)</li>
	 * </ul>
	 */
	public var interlaceMethod:int = 0;
	
	/**
	 * 根据传入的图像宽,高,位深,颜色类型创建文件头数据(IHDR),其余数据默认为0.
	 * @param w 图像宽度，以像素为单位 
	 * @param h  图像高度，以像素为单位 
	 * @param bd 图像深度(位深)
	 * @param ct 图像颜色类型
	 * @see IHDR
	 */
	public function IHDR(w:int, h:int, bd:int=8, ct:int=6){
		this.width = w;
		this.height = h;
		this.bitDepth = bd;
		this.colorType = ct;
		this.compressionMethod = 0;
		this.filterMethod = 0;
		this.interlaceMethod = 0;
	}
	
	public function getData():ByteArray{
		if(bitDepth == ByteDepth_1 || bitDepth == ByteDepth_2 || bitDepth == ByteDepth_4){
			if(colorType != CT_GreyScale && colorType != CT_IndexedColor){
				throw new PngError("BitDepth 1, 2 or 4 only can be used for GreyScale and IndexedColor!");
			}
		}else if(bitDepth == ByteDepth_16){
			if(colorType == CT_IndexedColor){
				throw new PngError("BitDepth 16 can't be used for IndexedColor!");
			}
		}
		
		var data:ByteArray = new ByteArray();
		data.writeInt(width);
		data.writeInt(height);
		data.writeByte(bitDepth);
		data.writeByte(colorType);
		data.writeByte(compressionMethod);
		data.writeByte(filterMethod);
		data.writeByte(interlaceMethod);
		return data;
	}
	
	public function getType():uint{
		return 0x49484452;
	}
}
}